package com.xydtech.ecard.merchant.service.impl;

import com.xydtech.common.annotation.DataScope;
import com.xydtech.common.core.domain.entity.SysDept;
import com.xydtech.common.core.text.Convert;
import com.xydtech.common.utils.AESEncryptionUtils;
import com.xydtech.common.utils.ShiroUtils;
import com.xydtech.common.utils.StringUtils;
import com.xydtech.ecard.custgroup.domain.EcardCustomerGroupMerchant;
import com.xydtech.ecard.custgroup.mapper.EcardCustomerGroupMerchantMapper;
import com.xydtech.ecard.merchant.domain.*;
import com.xydtech.ecard.merchant.mapper.EcardMerchantHandoverMapper;
import com.xydtech.ecard.merchant.mapper.EcardMerchantReservationTaskMapper;
import com.xydtech.ecard.merchant.mapper.EcardMerchantTaskMapper;
import com.xydtech.ecard.merchant.mapper.EcardPersonInfoMapper;
import com.xydtech.ecard.merchant.service.IEcardPersonInfoService;
import com.xydtech.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 电子名片个人信息Service业务层处理
 *
 * @author yuzhiguo
 * @date 2024-09-02 下午1:29
 */
@Service
public class EcardPersonInfoServiceImpl implements IEcardPersonInfoService {

    @Autowired
    private EcardPersonInfoMapper ecardPersonInfoMapper;
    @Autowired
    private EcardMerchantTaskMapper ecardMerchantTaskMapper;
    @Autowired
    private EcardMerchantReservationTaskMapper ecardMerchantReservationTaskMapper;
    @Autowired
    private EcardMerchantHandoverMapper ecardMerchantHandoverMapper;
    @Autowired
    private EcardCustomerGroupMerchantMapper ecardCustomerGroupMerchantMapper;
    @Autowired
    private ISysDeptService sysDeptService;

    /**
     * 查询电子名片个人信息
     *
     * @param id 电子名片个人信息主键
     * @return 电子名片个人信息
     */
    @Override
    public EcardPersonInfo selectEcardPersonInfoById(Long id)
    {
        return ecardPersonInfoMapper.selectEcardPersonInfoById(id);
    }

    /**
     * 查询电子名片个人信息列表
     *
     * @param ecardPersonInfo 电子名片个人信息
     * @return 电子名片个人信息
     */

    @Override
    @DataScope(userAlias = "c", deptAlias = "b")
    public List<EcardPersonInfo> selectEcardPersonInfoList(EcardPersonInfo ecardPersonInfo, String salt)
    {
        try {
            //数据加密（手机号、身份证号）
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustPhone())) {
                ecardPersonInfo.setPerCustPhone(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustPhone(), salt));
            }
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustIdcard())) {
                ecardPersonInfo.setPerCustIdcard(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustIdcard(), salt));
            }
            List<EcardPersonInfo> ecardPersonInfoList = ecardPersonInfoMapper.selectEcardPersonInfoList(ecardPersonInfo);
            if (ecardPersonInfoList.size() > 0) {
                for (EcardPersonInfo personInfo : ecardPersonInfoList) {
                    //数据解密（手机号、身份证号）
                    if (!StringUtils.objIsNullOrEmpty(personInfo.getPerCustPhone())) {
                        personInfo.setPerCustPhone(AESEncryptionUtils.decrypt(personInfo.getPerCustPhone(), salt));
                    }
                    if (!StringUtils.objIsNullOrEmpty(personInfo.getPerCustIdcard())) {
                        personInfo.setPerCustIdcard(AESEncryptionUtils.decrypt(personInfo.getPerCustIdcard(), salt));
                    }
                }
            }
            return ecardPersonInfoList;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 新增电子名片个人信息
     *
     * @param ecardPersonInfo 电子名片个人信息
     * @return 结果
     */
    @Override
    public int insertEcardPersonInfo(EcardPersonInfo ecardPersonInfo, String salt)
    {
        try {
            //数据加密（手机号、身份证号）
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustPhone())) {
                ecardPersonInfo.setPerCustPhone(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustPhone(), salt));
            }
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustIdcard())) {
                ecardPersonInfo.setPerCustIdcard(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustIdcard(), salt));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return ecardPersonInfoMapper.insertEcardPersonInfo(ecardPersonInfo);
    }

    /**
     * 修改电子名片个人信息
     *
     * @param ecardPersonInfo 电子名片个人信息
     * @return 结果
     */
    @Override
    public int updateEcardPersonInfo(EcardPersonInfo ecardPersonInfo, String salt)
    {
        try {
            //数据加密（手机号、身份证号）
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustPhone())) {
                ecardPersonInfo.setPerCustPhone(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustPhone(), salt));
            }
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustIdcard())) {
                ecardPersonInfo.setPerCustIdcard(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustIdcard(), salt));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return ecardPersonInfoMapper.updateEcardPersonInfo(ecardPersonInfo);
    }

    /**
     * 批量删除电子名片个人信息
     *
     * @param ids 需要删除的电子名片个人信息主键
     * @return 结果
     */
    @Override
    public int deleteEcardPersonInfoByIds(String ids)
    {
        return ecardPersonInfoMapper.deleteEcardPersonInfoByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除电子名片个人信息信息
     *
     * @param id 电子名片个人信息主键
     * @return 结果
     */
    @Override
    public int deleteEcardPersonInfoById(Long id)
    {
        return ecardPersonInfoMapper.deleteEcardPersonInfoById(id);
    }

    /**
     * 批量移交个人信息
     * @param ecardPersonInfoList
     * @param registId
     * @param userId
     * @return
     */
    @Override
    public int allocationEcardPersonInfo(List<EcardPersonInfo> ecardPersonInfoList, Long registId, Long userId) {
        //转交记录
        List<EcardMerchantHandover> ecardMerchantHandoverList = new ArrayList<>();
        //待办任务
        List<EcardMerchantTask> ecardMerchantTaskList = new ArrayList<>();
        //待办预约任务
        List<EcardMerchantReservationTask> merchantReservationTaskList = new ArrayList<>();
        //行业客户信息
        List<EcardCustomerGroupMerchant> customerGroupMerchantList = new ArrayList<>();

        for(int i = 0; i < ecardPersonInfoList.size(); i++){
            EcardPersonInfo ecardPersonInfo = ecardPersonInfoList.get(i);
            //查询个人信息
            EcardPersonInfo oldEcardPersonInfo = ecardPersonInfoMapper.selectEcardPersonInfoById(ecardPersonInfo.getId());

            EcardMerchantHandover ecardMerchantHandover = new EcardMerchantHandover();
            ecardMerchantHandover.setMerchantId(ecardPersonInfo.getId());
            ecardMerchantHandover.setTransferId(oldEcardPersonInfo.getManagementPersonnelId());
            ecardMerchantHandover.setTransferDeptId(oldEcardPersonInfo.getDeptId());
            ecardMerchantHandover.setRecipientId(ecardPersonInfo.getManagementPersonnelId());
            ecardMerchantHandover.setRecipientDeptId(ecardPersonInfo.getDeptId());
            ecardMerchantHandover.setMerchantType("1");//商户类型：1-个人，2-商户，3-企业，4-新型农业主体
            ecardMerchantHandoverList.add(ecardMerchantHandover);

            //查询拜访企业任务
            EcardMerchantTask ecardMerchantTask = new EcardMerchantTask();
            ecardMerchantTask.setMerchantId(ecardPersonInfo.getId());
            ecardMerchantTask.setMerchantType("1");//商户类型：1-个人，2-商户，3-企业，4-新型农业主体
            ecardMerchantTask.setTaskSts(0);
            List<EcardMerchantTask> taskList = ecardMerchantTaskMapper.selectEcardMerchantTaskList(ecardMerchantTask);
            //待办任务，最多只有一条
            EcardMerchantTask newEcardMerchantTask = null;
            if(taskList.size() > 0) {
                EcardMerchantTask oldEcardMerchantTask = taskList.get(0);
                newEcardMerchantTask = new EcardMerchantTask();
                newEcardMerchantTask.setId(oldEcardMerchantTask.getId());
                newEcardMerchantTask.setCmRegistId(ecardPersonInfo.getManagementPersonnelId());
                //待办任务list
                ecardMerchantTaskList.add(newEcardMerchantTask);
            }

            //查询未处理的企业预约任务
            List<EcardMerchantReservationTask> pendingMerchantReservationTaskList = ecardMerchantReservationTaskMapper.getMerchantReservationTaskByMerchantId(ecardPersonInfo.getId(), "1");
            merchantReservationTaskList.addAll(pendingMerchantReservationTaskList);

            //查询行业客户信息
            EcardCustomerGroupMerchant customerGroupMerchant = ecardCustomerGroupMerchantMapper.selectEcardCustomerGroupMerchantByMerchantId(ecardPersonInfo.getId(), "1");
            if (customerGroupMerchant != null) {
                EcardCustomerGroupMerchant groupMerchant = new EcardCustomerGroupMerchant();
                groupMerchant.setId(customerGroupMerchant.getId());
                groupMerchant.setManagementPersonnelId(ecardPersonInfo.getManagementPersonnelId());
                groupMerchant.setDeptId(ecardPersonInfo.getDeptId());
                SysDept sysDept = sysDeptService.selectSecondLevelDeptByDeptId(ecardPersonInfo.getDeptId());
                Long corpId = sysDept.getDeptId();//接收人的法人机构id
                groupMerchant.setCorpId(corpId);
                customerGroupMerchantList.add(groupMerchant);
            }
        }
        /**
         * 行业客户关联表同步批量转交20241204
         * 思路：
         * 1、先转交行业客户关联表中的信息，根据商户类型和商户id转交
         * 2、再转交对应商户信息
         */
        if(customerGroupMerchantList.size()>0) {
            //批量移交行业客户信息
            ecardCustomerGroupMerchantMapper.batchUpdateEcardGroupMerchantInfo(customerGroupMerchantList);
        }

        //批量移交个人
        int a = ecardPersonInfoMapper.batchUpdateEcardPersonInfo(ecardPersonInfoList);
        //批量插入移交记录
        int b = ecardMerchantHandoverMapper.batchInsertEcardMerchantHandover(ecardMerchantHandoverList);

        if(ecardMerchantTaskList.size()>0) {
            //批量修改待办任务所属客户经理
            ecardMerchantTaskMapper.batchUpdateEcardMerchantTask(ecardMerchantTaskList);
        }

        if(merchantReservationTaskList.size()>0) {
            //循环设置新的移交人
            for(EcardMerchantReservationTask ecardMerchantReservationTask:merchantReservationTaskList){
                ecardMerchantReservationTask.setCmRegistId(registId);
            }
            //批量修改商户预约待办任务所属客户经理
            ecardMerchantReservationTaskMapper.batchUpdateEcardMerchantReservationTask(merchantReservationTaskList);
        }
        return a > b ? b:a;
    }

    /**
     * 批量释放个人
     * @param ecardPersonInfoList
     * @return
     */
    @Override
    public int batchReleaseEcardPersonInfo(List<EcardPersonInfo> ecardPersonInfoList) {
        //待办任务
        List<EcardMerchantTask> ecardMerchantTaskList = new ArrayList<>();
        //待办预约任务
        List<EcardMerchantReservationTask> merchantReservationTaskList = new ArrayList<>();
        //行业客户信息
        List<EcardCustomerGroupMerchant> customerGroupMerchantList = new ArrayList<>();

        for(int i = 0; i < ecardPersonInfoList.size(); i++){
            EcardPersonInfo ecardPersonInfo = ecardPersonInfoList.get(i);
            //查询拜访个人信息任务
            EcardMerchantTask ecardMerchantTask = new EcardMerchantTask();
            ecardMerchantTask.setMerchantId(ecardPersonInfo.getId());
            ecardMerchantTask.setMerchantType("1");//商户类型：1-个人，2-商户，3-企业，4-新型农业主体
            ecardMerchantTask.setTaskSts(0);
            List<EcardMerchantTask> taskList = ecardMerchantTaskMapper.selectEcardMerchantTaskList(ecardMerchantTask);
            //待办任务，最多只有一条
            EcardMerchantTask newEcardMerchantTask = null;
            if(taskList.size() > 0) {
                EcardMerchantTask oldEcardMerchantTask = taskList.get(0);
                newEcardMerchantTask = new EcardMerchantTask();
                newEcardMerchantTask.setId(oldEcardMerchantTask.getId());
                newEcardMerchantTask.setCmRegistId(ecardPersonInfo.getManagementPersonnelId());
                //待办任务list
                ecardMerchantTaskList.add(newEcardMerchantTask);
            }

            //查询未处理的个人信息预约任务
            List<EcardMerchantReservationTask> pendingMerchantReservationTaskList = ecardMerchantReservationTaskMapper.getMerchantReservationTaskByMerchantId(ecardPersonInfo.getId(), "1");
            merchantReservationTaskList.addAll(pendingMerchantReservationTaskList);

            //处理行业客户信息
            EcardCustomerGroupMerchant groupMerchant = new EcardCustomerGroupMerchant();
            groupMerchant.setMerchantId(ecardPersonInfo.getId());
            groupMerchant.setMerchantType("1");//个人
            groupMerchant.setManagementPersonnelId(null);
            customerGroupMerchantList.add(groupMerchant);
        }

        //批量释放行业客户信息
        if (customerGroupMerchantList.size() > 0){
            ecardCustomerGroupMerchantMapper.batchReleaseEcardGroupMerchantInfo(customerGroupMerchantList);
        }

        //批量释放个人
        int i = ecardPersonInfoMapper.batchReleaseEcardPersonInfo(ecardPersonInfoList);

        if(ecardMerchantTaskList.size()>0) {
            //批量修改待办任务所属客户经理
            ecardMerchantTaskMapper.batchUpdateEcardMerchantTask(ecardMerchantTaskList);
        }

        if(merchantReservationTaskList.size()>0) {
            //循环设置客户经理为null
            for(EcardMerchantReservationTask ecardMerchantReservationTask:merchantReservationTaskList){
                ecardMerchantReservationTask.setCmRegistId(null);
            }
            //批量修改个人预约待办任务所属客户经理
            ecardMerchantReservationTaskMapper.batchUpdateEcardMerchantReservationTask(merchantReservationTaskList);
        }

        return i;
    }

    /**
     * 批量启用/停用个人
     * @param ecardPersonInfoList
     * @return
     */
    @Override
    public int batchSwitchOverEcardPersonInfo(List<EcardPersonInfo> ecardPersonInfoList) {
        //行业客户信息
        List<EcardCustomerGroupMerchant> customerGroupMerchantList = new ArrayList<>();
        for(int i = 0; i < ecardPersonInfoList.size(); i++){
            EcardPersonInfo ecardPersonInfo = ecardPersonInfoList.get(i);
            //处理行业客户信息
            EcardCustomerGroupMerchant groupMerchant = new EcardCustomerGroupMerchant();
            groupMerchant.setMerchantId(ecardPersonInfo.getId());
            groupMerchant.setMerchantType("1");//个人
            groupMerchant.setState(ecardPersonInfo.getState());
            customerGroupMerchantList.add(groupMerchant);
        }
        //批量启/停用行业客户信息
        if (customerGroupMerchantList.size() > 0){
            ecardCustomerGroupMerchantMapper.batchSwitchOverEcardGroupMerchantInfo(customerGroupMerchantList);
        }
        return ecardPersonInfoMapper.batchSwitchOverEcardPersonInfo(ecardPersonInfoList);
    }

    /**
     * 查询导出的个人信息
     * @param ecardPersonInfo
     * @return
     */
    @Override
    public List<EcardPersonInfo> selectEcardPersonInfoListByExport(EcardPersonInfo ecardPersonInfo, String salt) {
        SysDept sysDept = sysDeptService.selectSecondLevelDeptByDeptId(ShiroUtils.getSysUser().getDeptId());
        ecardPersonInfo.setDictDeptId(sysDept.getDeptId());
        try {
            //数据加密（手机号、身份证号）
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustPhone())) {
                ecardPersonInfo.setPerCustPhone(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustPhone(), salt));
            }
            if (!StringUtils.objIsNullOrEmpty(ecardPersonInfo.getPerCustIdcard())) {
                ecardPersonInfo.setPerCustIdcard(AESEncryptionUtils.encrypt(ecardPersonInfo.getPerCustIdcard(), salt));
            }
            List<EcardPersonInfo> ecardPersonInfoList = ecardPersonInfoMapper.selectEcardPersonInfoListByExport(ecardPersonInfo);
            if (ecardPersonInfoList.size() > 0) {
                for (EcardPersonInfo personInfo : ecardPersonInfoList) {
                    //数据解密（手机号、身份证号）
                    if (!StringUtils.objIsNullOrEmpty(personInfo.getPerCustPhone())) {
                        personInfo.setPerCustPhone(AESEncryptionUtils.decrypt(personInfo.getPerCustPhone(), salt));
                    }
                    if (!StringUtils.objIsNullOrEmpty(personInfo.getPerCustIdcard())) {
                        personInfo.setPerCustIdcard(AESEncryptionUtils.decrypt(personInfo.getPerCustIdcard(), salt));
                    }
                }
            }
            return ecardPersonInfoList;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 根据id集合查询个人信息
     * @param ids
     * @return
     */
    @Override
    public List<EcardPersonInfo> selectEcardPersonInfoByIds(String ids, String salt) {
        SysDept sysDept = sysDeptService.selectSecondLevelDeptByDeptId(ShiroUtils.getSysUser().getDeptId());
        try {
            List<EcardPersonInfo> ecardPersonInfoList = ecardPersonInfoMapper.selectEcardPersonInfoByIds(Convert.toStrArray(ids), sysDept.getDeptId());
            if (ecardPersonInfoList.size() > 0) {
                for (EcardPersonInfo personInfo : ecardPersonInfoList) {
                    //数据解密（手机号、身份证号）
                    if (!StringUtils.objIsNullOrEmpty(personInfo.getPerCustPhone())) {
                        personInfo.setPerCustPhone(AESEncryptionUtils.decrypt(personInfo.getPerCustPhone(), salt));
                    }
                    if (!StringUtils.objIsNullOrEmpty(personInfo.getPerCustIdcard())) {
                        personInfo.setPerCustIdcard(AESEncryptionUtils.decrypt(personInfo.getPerCustIdcard(), salt));
                    }
                }
            }
            return ecardPersonInfoList;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}
